#include "file.h"


extern struct FILEINFO *finfo ;

//通过全名查找

struct FILEINFO * file_search (char name[]) { 
	//char str [5][10] ;
	char filename [15];
	int i,j,k,length = strlen(name) ;
	//int flag =0;

	for (i =0 ; i < length ; i++) { 
		if ('a'<=name[i] && name[i] <='z'){  //把字符串转为大写
			name[i] -= 0x20 ;
		}
	}

	for (i = 0 ; i < 224 ;i ++) { 
		if (finfo[i].name[0] ==0x00){  //不包含任何文件信息
			break ;
		}
		if (finfo[i].name[0] !=0xe5) {  //文件已经被删除
			for (j = 0 ; j < 8 ;j++){ 
				if (finfo[i].name[j]==' ' ||finfo[i].name[j]=='\0'){ 
					break ;
				}
				filename[j] = finfo[i].name[j] ;
			}
			if (finfo[i].ext[0] !=' ' &&finfo[i].ext[0] !='\0') { 
				filename[j++] = '.' ;
			}
			for (k=0 ; k < 3 ; k++){ 
				if (finfo[i].ext[k]==' ' ||finfo[i].ext[k]=='\0'){ 
					break ;
				}
				filename[j++] = finfo[i].ext[k];
			}
			filename[j] = '\0' ;
			if (strcmp (name ,filename) ==0){ 
				return &finfo[i] ;
			}
		}

	}
	

	return  0 ; 
}


/* @file :被读文件
   @fat  :被解压过的fat表
   @img  :fat数据区起始地址
   @buf  :文件的缓存

 */
void file_loadfile (struct FILEINFO * file , int * fat ,   char *img ,char * buf){ 
	int size = file->size ;
	int clustno = file->clustno ;
	int i , j =0 ;
	for (;;) { 
		if (size <=512) { 
			for (i = 0 ; i <size ; i++) { 
				buf[j++]= img[clustno*512 +i] ; 
			}
			break ;
		}
		for (i = 0 ; i <512 ;i++) { 
			buf[j++]= img[clustno*512 +i] ; 
		}
		clustno = fat[clustno] ; //在fat12表中读到下一扇区的地址
		size -=512 ;

	}
	
}

// img -->fat表的内存映射 , int *fat  ----> 解码后存放的地址
void file_fatdecode (int * fat,unsigned char * img) { 
	int i=0 , j = 0 ; 
	for (i = 0 ; i< 2880 ; i +=2){ 
		fat[i+0] = (img[j+0]    | img[j+1] <<8) & 0xfff;
		fat[i+1] = (img[j+1]>>4 | img[j+2]<<4)  & 0xfff; 
		j+=3 ;
	}
}